"""
案例：使用TPShop项目完成对登录功能的接口测试
获取验证码： http://localhost/index.php?m=Home&c=User&a=verify
登录 ： http://localhost/index.php?m=Home&c=User&a=do_login
"""

"""
注意:每個方法都共同會用到前置的setUp()及後置的tearDown()方法
# 导包
# 创建测试类(這個類需要集成unittest.TestCase)
# 创建测试方法
    # setup
        # 实例化session对象
        # 定义验证接口url地址
        # 定义登录接口url地址
    # teardown
        # 关闭session对象
    # 登录成功
        # 发送验证码请求并断言
        # 发登录请求并断言
    # 账号不存在
        # 发送验证码请求并断言
        # 发登录请求并断言
    # 密码错误
        # 发送验证码请求并断言
        # 发登录请求并断言
"""
# 导包
import json
import requests
import unittest
from parameterized import parameterized

# 構造測試數據
def build_data():
    # 產生一個空列表,用來儲存json數據文件
    test_data = []
    # 定義要讀入的json數據文件路徑
    file = "./data/login.json"
    # 打開文件流f來讀取json數據文件內容,並將其存入test_data列表中
    with open(file, encoding="utf-8") as f:
        # 把文件f的內容以json格式load進入json_data列表中
        json_data = json.load(f)
        # 遍歷json_data列表中的每一個element case_data,
        # 取出每一個參數,並將每組測試參數附加入(append)test_data列表中
        for case_data in json_data:
            username = case_data.get("username")
            password = case_data.get("password")
            verify_code = case_data.get("verify_code")
            status_code = case_data.get("status_code")
            status = case_data.get("status")
            msg = case_data.get("msg")
            # 以元祖(tuple)的形式將每一組測試資料元件附加入(append)test_da列表中表中
            test_data.append((username, password, verify_code, status_code, status, msg))
        # 以(username, password, verify_code, status_code, status, msg)形式打印test_data列表
        print("test_data=".format(username, password, verify_code, status_code, status, msg))
    # 最後回傳test_data列表
    return test_data

# 创建测试类
class TPShopLogin2(unittest.TestCase):
    # 创建测试方法
    # setup (前置方法)
    def setUp(self):
        # 实例化session对象
        self.session = requests.Session()
        # 定义验证接口url地址
        self.url_verify = "http://localhost/index.php?m=Home&c=User&a=verify"
        # 定义登錄接口url地址
        self.url_login = "http://localhost/index.php?m=Home&c=User&a=do_login"
    # teardown(後製方法)
    def tearDown(self):
        # 关闭session对象
        self.session.close()

    # 用例實現
    # test01 登录成功
    # 調用方法時是利用修飾器@parameterized來調用由build_data()所建立的json測試資料文件
    @parameterized.expand(build_data())
    def test01_login(self, username, password, verify_code, status_code, status, msg):
        # 发送验证码请求并断言(get)
        response = self.session.get(url=self.url_verify)
        self.assertEqual(200, response.status_code)
        self.assertIn("image", response.headers.get("Content-Type"))
        # 发登录请求并断言(post)
        self.url_data = {
            "username": username,
            "password": password,
            "verify_code": verify_code
        }
        response = self.session.post(url=self.url_login, data=self.url_data)
        print("=" * 100)
        print(response.json())
        self.assertEqual(status_code, response.status_code)
        self.assertEqual(status, response.json().get("status"))
        self.assertIn(msg, response.json().get("msg"))